package models

import (
	"fmt"
	"football/src/utils"
	"net"
	"regexp"
	"time"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

type UserBasic struct {
	gorm.Model
	PassWord   string    `json:"password" gorm:"用户密码"`
	Phone      string    `json:"phone" valid:"matches(^1[3-9]{1}\\d{9}$)" gorm:"手机号"`
	Email      string    `json:"email" valid:"email" gorm:"邮箱"`
	ClientIP   string    `json:"client_ip" gorm:"用户登录IP"`
	ClientPort string    `json:"client_port" gorm:"用户登录端口"`
	Salt       string    `json:"salt" gorm:"用户密码加解密字段"`
	LoginTime  time.Time `json:"login_time" gorm:"最近登录时间"`
	LogoutTime time.Time `json:"logout_time" gorm:"登出时间"`
	DeviceInfo string    `json:"device_info" gorm:"用户登录设备信息"`
	Type       int       `json:"type"  gorm:"账号状态"` //  1：正常使用 2：已删除 3：注销
	Avatar     string    `json:"avatar"  gorm:"头像"`
	NickName   string    `json:"nickname"  gorm:"昵称"`
	Background string    `json:"background" gorm:"主页的背景图片"`
	Intro      string    `json:"intro" gorm:"个人简介"`
}

func (table *UserBasic) TableName() string {
	return "user_basic"
}

func CreateUser(user *UserBasic) error {
	user.Avatar = "avatar/default.jpg"
	user.Background = "background/back.jpg"
	user.NickName = "用户" + utils.GenerateRandomString(4)
	user.Type = 1
	return utils.Football.Create(&user).Error
}

func AddIP(c *gin.Context, user *UserBasic) {
	serverAddress := "http://" + c.Request.Host + "/static"
	user.Avatar = fmt.Sprintf("%s/%s", serverAddress, user.Avatar)
	user.Background = fmt.Sprintf("%s/%s", serverAddress, user.Background)
}

func HasUserPassword(account string, password string) (*UserBasic, string) {
	var user UserBasic
	var err error
	// 正则表达式用于匹配手机号码（假设是中国的手机号码）
	phoneRegex := `^1[3-9]\d{9}$`
	emailRegex := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`

	// 检查 account 是手机还是邮箱，并根据情况查询数据库
	isPhone := regexp.MustCompile(phoneRegex).MatchString(account)
	isEmail := regexp.MustCompile(emailRegex).MatchString(account)

	if isPhone {
		err = utils.Football.Where("phone = ? and password = ?", account, password).First(&user).Error
	} else if isEmail {
		err = utils.Football.Where("email = ? and password = ?", account, password).First(&user).Error
	} else {
		return nil, "账户格式错误"
	}
	// 检查是否找到了用户
	if err != nil {
		return nil, "用户不存在或密码错误" // 用户不存在或密码错误
	}
	return &user, "登录成功" // 登录成功，返回用户信息
}

func UpdateTime(id string, action string) error {
	// 创建一个映射，用于更新登录或登出时间
	updateData := make(map[string]interface{})

	// 根据 action 设置需要更新的字段
	if action == "login" {
		updateData["LoginTime"] = time.Now()
	} else {
		updateData["LogoutTime"] = time.Now()
	}

	// 更新数据库中的用户记录
	return utils.Football.Model(&UserBasic{}).Where("id = ?", id).Updates(updateData).Error
}
func UpdateUser(user *UserBasic) error {
	return utils.Football.Model(&UserBasic{}).Where("id = ?", user.ID).Updates(user).Error
}
func GetUserByID(id string) (*UserBasic, error) {
	var user *UserBasic
	err := utils.Football.Model(&UserBasic{}).Where("id =?", id).First(&user).Error
	if err != nil {
		return nil, err
	}
	return user, nil
}

func UserIPAndPort(c *gin.Context, user *UserBasic) error {

	// 获取用户的端口，这个信息通常不直接从请求中获取，
	// 但如果需要获取端口可以通过请求的 RemoteAddr 获取
	remoteAddr := c.Request.RemoteAddr
	_, port, err := net.SplitHostPort(remoteAddr)
	user.ClientIP = c.ClientIP()
	user.ClientPort = port
	if err != nil {
		return err
	}
	return nil
}
